package com.sxj.corejava.code02_运算符;

/**
 * @author 石小俊
 * @date 2024年03月02日 11:01
 */
public class Test07_位运算符 {

    public static void main(String[] args) {
        // 5的二进制:00000000 00000000 00000000 00000101
        // 8的二进制:00000000 00000000 00000000 00001000
        // 结果:00000000 00000000 00000000 00000000
        System.out.println(5 & 8);

        // 5的二进制:00000000 00000000 00000000 00000101
        // 8的二进制:00000000 00000000 00000000 00001000
        // 结果:00000000 00000000 00000000 00001101=13
        System.out.println(5 | 8);

        // 5的二进制:00000000 00000000 00000000 00000101
        // 结果:11111111 11111111 11111111 11111010
        // 由于结果高位为1,表示一个负数,此时是一个补码,需要计算出其原码再进行转换
        // 反码:11111111 11111111 11111111 11111001
        // 原码:10000000 00000000 00000000 00000110=-6
        System.out.println(~5);

        // 5的二进制:00000000 00000000 00000000 00000101
        // 8的二进制:00000000 00000000 00000000 00001000
        // 结果:00000000 00000000 00000000 00001101
        System.out.println(5 ^ 8);

        // 5的二进制:00000000 00000000 00000000 00000101
        // 左移2位后:00000000 00000000 00000000 00010100=4+16=20
        System.out.println(5 << 2);

        // 5的二进制:00000000 00000000 00000000 00000101
        // 右移两位后:00000000 00000000 00000000 00000001 = 1
        System.out.println(5 >> 2);

        // -8的二进制:10000000 00000000 00000000 00001000
        // 在计算机中所有运算都是通过补码进行运算的
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 右移两位后:11111111 11111111 11111111 11111110
        // 反码:11111111 11111111 11111111 11111101
        // 原码:10000000 00000000 00000000 00000010=-2
        System.out.println(-8 >> 2);

        // 正数与右移一致
        System.out.println(5 >>> 2);
        // 负数存在区别
        // -8的二进制:10000000 00000000 00000000 00001000
        // 在计算机中所有运算都是通过补码进行运算的
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 右移两位后:00111111 11111111 11111111 11111110
        System.out.println(-8 >>> 2);
    }

}
